package com.ahaoyou.sync;


import org.openjdk.jol.info.ClassLayout;

/**
 * 关闭指针压缩（-XX:-UseCompressedOops）
 */
public class ObjectTest {
    /**
     * 对象结构：对象头（Header），实例数据（Instance Data）和对象填充（Padding）。
     * 对象大小计算
     * 对象头占12个字节
     * 实例数据     boolean 1个字节  byte	1字节    char  2字节   short	2字节  float	4字节 int 4个字节   long 8个字节  double 8 字节
     * 对齐填充   不足8的倍数进行填充  jvm中对象存储必须是8个字节的倍数
     */
    public static void main(String[] args) throws InterruptedException {
        //jvm延迟偏向
        Thread.sleep(5000);
        Object obj = new Test();
        //Object obj = new Integer[4];
        //obj.hashCode();
        //查看对象内部信息
        System.out.println(ClassLayout.parseInstance(obj).toPrintable());
        new Thread(() -> {
            synchronized (obj) {
                System.out.println(Thread.currentThread().getName() + "\n" + ClassLayout.parseInstance(obj).toPrintable());
            }
            System.out.println(Thread.currentThread().getName() + "释放锁\n" + ClassLayout.parseInstance(obj).toPrintable());
            // jvm 优化
            try {
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }, "Thread1").start();

        Thread.sleep(2000);

        new Thread(() -> {
            synchronized (obj) {
                System.out.println(Thread.currentThread().getName() + "\n" + ClassLayout.parseInstance(obj).toPrintable());
            }
        }, "Thread2").start();
    }
}


class Test {
    private boolean flag;
    private long p;
    private String a = "123";
}

